package com.bookrecomm.dao;

import com.bookrecomm.entity.Favorite;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 收藏数据访问接口
 * 提供用户收藏图书相关的数据库操作方法
 */
@Repository
public interface FavoriteRepository extends JpaRepository<Favorite, Long> {

    /**
     * 根据用户ID和图书ID查询收藏记录
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 收藏记录对象（可能为空）
     */
    Optional<Favorite> findByUser_IdAndBook_Id(Long userId, Long bookId);

    /**
     * 检查用户是否已收藏图书
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 是否已收藏
     */
    boolean existsByUser_IdAndBook_Id(Long userId, Long bookId);

    /**
     * 根据用户ID查询收藏记录
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 收藏记录分页列表
     */
    @Query("SELECT f FROM Favorite f WHERE f.user.id = :userId ORDER BY f.createdAt DESC")
    Page<Favorite> findByUserId(@Param("userId") Long userId, Pageable pageable);

    /**
     * 统计用户收藏的图书数量
     * @param userId 用户ID
     * @return 图书数量
     */
    @Query("SELECT COUNT(f) FROM Favorite f WHERE f.user.id = :userId")
    Long countByUserId(@Param("userId") Long userId);

    /**
     * 统计图书被收藏的次数
     * @param bookId 图书ID
     * @return 收藏次数
     */
    @Query("SELECT COUNT(f) FROM Favorite f WHERE f.book.id = :bookId")
    Long countByBookId(@Param("bookId") Long bookId);

    /**
     * 查询热门收藏图书（根据收藏次数）
     * @param pageable 分页参数
     * @return 图书ID和收藏次数
     */
    @Query("SELECT f.book.id, COUNT(f) as favoriteCount FROM Favorite f GROUP BY f.book.id ORDER BY favoriteCount DESC")
    List<Object[]> findHotFavoriteBooks(Pageable pageable);

    /**
     * 删除用户对某本图书的收藏
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 删除的记录数
     */
    long deleteByUser_IdAndBook_Id(Long userId, Long bookId);
}
